import 'dart:io';

String _data = '0';

///异步队列问题
void main() {
  ///BACD
  // testFuture();

  ///ACDB
  // testFuture2();

  ///顺序执行
  // testFuture3();

  ///依赖执行，链式关系
  // testFuture4();

  ///汇总所有的
  testFuture5();
  print('A');
}

/**
 *  B
    A
    C
    D
 */
void testFuture() {
  Future(() {
    sleep(Duration(seconds: 1));
    print('C');
  }).then((value) => print('D'));

  print('B');
}

/**
 *  A
    C
    D
    B
 */
void testFuture2() async {
  await Future(() {
    sleep(Duration(seconds: 1));
    print('C');
  }).then((value) => print('D'));

  //B也变成异步的了，整个方法都变成异步的
  print('B');
}

/**顺序执行：
 * 任务添加完毕
    A
    任务1结束
    任务2结束
    任务3结束
    任务4结束
 */
void testFuture3() async {
  Future(() {
    return '任务1';
  }).then((value) => print('$value结束'));
  Future(() {
    sleep(Duration(seconds: 3));
    return '任务2';
  }).then((value) => print('$value结束'));
  Future(() {
    return '任务3';
  }).then((value) => print('$value结束'));
  Future(() {
    return '任务4';
  }).then((value) => print('$value结束'));

  print('任务添加完毕');
}

/**
 * 一个任务接着一个任务去执行。
 * 后一个任务依赖前一个任务结束
 *
 * 任务添加完毕
    A
    任务1结束
    任务1任务2结束
    任务1任务2任务3结束
 */
void testFuture4() async {
  Future(() {
    return '任务1';
  }).then((value) {
    print('$value结束');
    return '$value任务2';
  }).then((value) {
    print('$value结束');
    return '$value任务3';
  }).then((value) {
    print('$value结束');
    return '$value任务4';
  });
  print('任务添加完毕');
}

/**
 * 多个Future(多个异步任务)队列任务
 * 全部处理完毕才会有结果
 * 串行队列
 *
 * A
    任务A 执行
    任务B 执行
    任务C 执行
    任务C任务B任务A
 */
void testFuture5() async {
  Future.wait([
    Future(() {
      print('任务A 执行');
      return '任务A';
    }),
    Future(() {
      print('任务B 执行');
      return '任务B';
    }),
    Future(() {
      print('任务C 执行');
      return '任务C';
    })
  ]).then((value) => print(value[2] + value[1] + value[0])); //打印结果随意组装
}
